#include "stdafx.h"
#include "XEnumConfigNodeImpl.h"

#include <XStrUtil.h>
#include <Util.h>
#include "XConfigNodeImpl.h"

IMPLEMENT_SKIN_CLASS(CXEnumConfigNodeImpl);

//////////////////////////////////////////////////////////////////////////
CXEnumConfigNodeImpl::CXEnumConfigNodeImpl()
{
    m_pFirstNode = NULL;
    m_pCurrentNode = NULL;
}

CXEnumConfigNodeImpl::~CXEnumConfigNodeImpl()
{
    m_pFirstNode = NULL;
    m_pCurrentNode = NULL;
}


//////////////////////////////////////////////////////////////////////////
// IXEnumConfigNode
HRESULT CXEnumConfigNodeImpl::Reset()
{
    m_pCurrentNode = NULL;
    return S_OK;
}

HRESULT CXEnumConfigNodeImpl::put_FirstElement(IN XHANDLE xElment, IN LPCTSTR szNodeName)
{
    if(xElment == NULL)
        return E_FAIL;

    m_strNodeName = (szNodeName == NULL) ? "" : XStrUtil::StrToAnsi(szNodeName);
    m_pFirstNode = (TiXmlElement*)xElment;
    m_pCurrentNode = NULL;
    Reset();
    return S_OK;
}

HRESULT CXEnumConfigNodeImpl::Next(IXConfigNode** pData)
{
    if(m_pCurrentNode == NULL)
    {
        m_pCurrentNode = m_pFirstNode;
    }
    else if(m_strNodeName.empty())
    {
        m_pCurrentNode = m_pCurrentNode->NextSiblingElement();
    }
    else
    {
        m_pCurrentNode = m_pCurrentNode->NextSiblingElement(m_strNodeName.c_str());
    }

    if(m_pCurrentNode == NULL)
    {
        return S_FALSE;
    }
    else
    {
        if((*pData) == NULL)
        {
            (*pData) = XAlloc(CXConfigNodeImpl);
        }

        CXConfigNodeImpl* pConfigNode = dynamic_cast<CXConfigNodeImpl*>(*pData);
        if(pConfigNode != NULL)
        {
            pConfigNode->put_Node((XHANDLE)m_pCurrentNode);
            return S_OK;
        }
        return E_FAIL;
    }
}
